#ifndef _BUTTON_H_
#define _BUTTON_H_

#ifdef __cplusplus
extern "C"
{
#endif

	typedef unsigned char uint8_t;
	typedef unsigned short uint16_t;

#define ButtonTick 20u
#define CONFIG_DEFAULT_LONG_PRESS_TRIG_TIME	1000u
#define CONFIG_DEFAULT_LONG_PRESS_REPEAT_TIME 200u

	enum
	{
		ButtonFalse = 0,
		ButtonTrue,
	};

	enum
	{
		ButtonEventNone = 0,
		ButtonEventPressTrig,		// 按下触发(边沿触发)
		ButtonEventReleaseTrig,		// 松开触发(边沿触发)
		ButtonEventClicked,			// 单击事件
		ButtonEventDClicked,		// 双击事件
		ButtonEventLongPressed,		// 长按事件
		ButtonEventLongPressRepeat, // 长按重复事件，重复时间为longPressRepeatTime

		ButtonEventMax,
	};

	typedef uint8_t (*GetButtonState)(void);

	typedef struct
	{
		uint16_t longPressRepeatTime : 10; // 按键重复事件产生间隔(ms)
		uint16_t pressTimes : 3;		   // 按下次数，用于判断单击和双击
		uint16_t lastState : 1; // true: 按下  false: 释放
		uint16_t state : 1;		// true: 按下  false: 释放
		uint16_t eventTrig : 1;

		uint16_t tick : 10;	// BUTTON_TICK ms/tick
		uint16_t event : 3; // 按钮事件

		GetButtonState getState; // 获取按钮状态回调，由用户定义
	} Button;

	void ButtonInit(Button *button, GetButtonState getButtonState);
	void ButtonSetLongPressRepeatTime(Button *button, uint16_t t);
	uint8_t ButtonHandler(Button *button);

#ifdef __cplusplus
}
#endif

#endif
